package administracion;

import java.util.ArrayList;
import java.util.List;

import dao.AdministracionDAO;
import dao.ClienteDAO;
import dao.EncomiendaDAO;
import dao.ProveedorDAO;
import dao.VehiculoDAO;
import dto.Encomienda.DTO_ActividadEncomienda;
import dto.Encomienda.DTO_Destinatario;
import dto.Encomienda.DTO_Encomienda;
import dto.Encomienda.DTO_EncomiendaEmpresa;
import dto.Encomienda.DTO_EncomiendaParticular;
import dto.Encomienda.DTO_Envio;
import dto.Encomienda.DTO_EnvioPropio;
import dto.Encomienda.DTO_EnvioTercerizado;
import dto.Encomienda.DTO_HojaDeRuta;
import dto.Encomienda.DTO_ProductoClienteEncomienda;
import dto.Encomienda.DTO_Remito;
import dto.Encomienda.DTO_Trayecto;
import dto.Encomienda.DTO_TrayectoIntersucursal;
import dto.Encomienda.DTO_TrayectoOrigenSucursal;
import dto.Encomienda.DTO_TrayectoSucursalDestino;
import entity.Administracion.Entity_Destino;
import entity.Administracion.Entity_Sucursal;
import entity.Cliente.Entity_Cliente;
import entity.Cliente.Entity_DireccionEntrega;
import entity.Cliente.Entity_FacturaCliente;
import entity.Cliente.Entity_ProductoCliente;
import entity.Encomienda.Entity_ActividadEncomienda;
import entity.Encomienda.Entity_Destinatario;
import entity.Encomienda.Entity_Encomienda;
import entity.Encomienda.Entity_EncomiendaEmpresa;
import entity.Encomienda.Entity_EncomiendaParticular;
import entity.Encomienda.Entity_EnvioPropio;
import entity.Encomienda.Entity_EnvioTercerizado;
import entity.Encomienda.Entity_HojaDeRuta;
import entity.Encomienda.Entity_Manifiesto;
import entity.Encomienda.Entity_ProductoClienteEncomienda;
import entity.Encomienda.Entity_Remito;
import entity.Encomienda.Entity_Trayecto;
import entity.Encomienda.Entity_TrayectoIntersucursal;
import entity.Encomienda.Entity_TrayectoOrigenSucursal;
import entity.Encomienda.Entity_TrayectoSucursalDestino;
import entity.Proveedor.Entity_Proveedor;
import entity.Vehiculo.Entity_Vehiculo;

public class Gestor_Encomienda {
	private static Gestor_Encomienda instancia;
	
	private Gestor_Encomienda(){
		
	}
	
	public static Gestor_Encomienda getInstancia(){
		if(instancia == null){
			instancia = new Gestor_Encomienda();
		} 
		return instancia;
	}
	

	public void agregarActividad(DTO_ActividadEncomienda actividad) {
		Entity_Encomienda e = null;
		 
		e = (Entity_EncomiendaParticular)EncomiendaDAO.getInstancia().getEncomiendaParticular(actividad.getIdEncomienda());
		if(e==null)
			e = (Entity_EncomiendaEmpresa)EncomiendaDAO.getInstancia().getEncomiendaEmpresa(actividad.getIdEncomienda());

		Entity_ActividadEncomienda a = new Entity_ActividadEncomienda();
		a.setFecha(actividad.getFecha());
		a.setDescripcion(actividad.getDescripcion());
		a.setEncomienda(e);
		
		EncomiendaDAO.getInstancia().altaActividadEncomienda(a);
		
	}


	public DTO_ActividadEncomienda getActividad(Integer idActividad) {
		return EncomiendaDAO.getInstancia().getActividadEncomienda(idActividad).toDTO();
	}


	public void altaDestinatario(DTO_Destinatario destinatario) {
		Entity_Encomienda e = null;
		 
		e = (Entity_EncomiendaParticular)EncomiendaDAO.getInstancia().getEncomiendaParticular(destinatario.getIdEncomienda());
		if(e==null)
			e = (Entity_EncomiendaEmpresa)EncomiendaDAO.getInstancia().getEncomiendaEmpresa(destinatario.getIdEncomienda());

		
		Entity_Destinatario d = new Entity_Destinatario();
		d.setDni(destinatario.getDni());
		d.setNombre(destinatario.getNombre());
		d.setApellido(destinatario.getApellido());
		d.setEncomienda(e);
		
		EncomiendaDAO.getInstancia().altaDestinatario(d);
	}


	public void modificarDestinatario(DTO_Destinatario destinatario) {
		Entity_Encomienda e = null;
		 
		e = (Entity_EncomiendaParticular)EncomiendaDAO.getInstancia().getEncomiendaParticular(destinatario.getIdEncomienda());
		if(e==null)
			e = (Entity_EncomiendaEmpresa)EncomiendaDAO.getInstancia().getEncomiendaEmpresa(destinatario.getIdEncomienda());

		
		Entity_Destinatario d = new Entity_Destinatario();
		d.setId(destinatario.getId());
		d.setDni(destinatario.getDni());
		d.setNombre(destinatario.getNombre());
		d.setApellido(destinatario.getApellido());
		d.setEncomienda(e);
		
		EncomiendaDAO.getInstancia().modificarDestinatario(d);
	}


	public void bajaDestinatario(Integer idDestinatario) {
		Entity_Destinatario d = EncomiendaDAO.getInstancia().getDestinatario(idDestinatario);
		if(d != null)
			EncomiendaDAO.getInstancia().bajaDestinatario(d);
	}


	public DTO_Destinatario getDestinatario(Integer idDestinatario) {
		return EncomiendaDAO.getInstancia().getDestinatario(idDestinatario).toDTO();
	}


	public void altaEncomiendaEmpresa(DTO_EncomiendaEmpresa encomienda) {
		Entity_EncomiendaEmpresa e = new Entity_EncomiendaEmpresa();

		Entity_Sucursal origen = AdministracionDAO.getInstancia().getSucursal(encomienda.getIdSucursalOrigen());
		e.setSucursalOrigen(origen);
		
		Entity_Destino destino = null;
		destino = AdministracionDAO.getInstancia().getDestinoNacional(encomienda.getIdDestino());
		if(destino != null)
			destino = AdministracionDAO.getInstancia().getDestinoInternacional(encomienda.getIdDestino());
		e.setDestino(destino);
		
		Entity_Sucursal sucursalActual = AdministracionDAO.getInstancia().getSucursal(encomienda.getIdSucursalActual());
		e.setSucursalActual(sucursalActual);
		e.setFechaRecepcion(encomienda.getFechaRecepcion());
		e.setFechaMaxima(encomienda.getFechaMaxima());
		e.setEstado(encomienda.getEstado());
		
		Entity_Proveedor prov = ProveedorDAO.getInstancia().getProveedor(encomienda.getIdAseguradora());
		e.setAseguradora(prov);
		e.setLargo(encomienda.getLargo());
		e.setAlto(encomienda.getAlto());
		e.setAncho(encomienda.getAncho());
		e.setPeso(encomienda.getPeso());
		e.setVolumen(encomienda.getVolumen());
		e.setTratamiento(encomienda.getTratamiento());
		e.setApilable(encomienda.isApilable());
		e.setCantApilable(encomienda.getCantApilable());
		e.setRefrigerado(encomienda.isRefrigerado());
		e.setCondicionTransporte(encomienda.getCondicionTransporte());
		e.setIndicacionesManipulacion(encomienda.getIndicacionesManipulacion());
		e.setFragilidad(encomienda.getFragilidad());
		e.setTercerizado(encomienda.isTercerizado());
		e.setKilometrosRecorridos(encomienda.getKilometrosRecorridos());
		e.setFacturado(encomienda.isFacturado());
		e.setValorEstimado(encomienda.getValorEstimado());
		e.setDistanciaEstimadaKM(encomienda.getDistanciaEstimadaKM());
		Entity_Cliente c = ClienteDAO.getInstancia().getCliente(encomienda.getIdCliente());
		e.setCliente(c);
		Entity_DireccionEntrega dir = ClienteDAO.getInstancia().getDireccionEntrega(encomienda.getIdDireccionEntrega());
		e.setDireccionEntrega(dir);
		e.setaRetirar(encomienda.isaRetirar());
		e.setLugarRetiro(encomienda.getLugarRetiro());
		e.setFechaRetiro(encomienda.getFechaRetiro());
		e.setHoraMinima(encomienda.getHoraMinima());
		e.setHoraMaxima(encomienda.getHoraMaxima());
		
		Entity_FacturaCliente f = ClienteDAO.getInstancia().getFacturaCliente(encomienda.getIdFacturaCliente());
		e.setFactura(f);
		
		List<Entity_ProductoClienteEncomienda> productos = new ArrayList<Entity_ProductoClienteEncomienda>();
		for(DTO_ProductoClienteEncomienda p : encomienda.getProductos()){
			Entity_ProductoClienteEncomienda producto = new Entity_ProductoClienteEncomienda();
			producto.setCantidad(p.getCantidad());
			Entity_ProductoCliente pc = ClienteDAO.getInstancia().getProductoCliente(p.getIdProductoCliente());
			producto.setProductoCliente(pc);
			productos.add(producto);
		}
		e.setProductos(productos);
		Entity_Manifiesto m = EncomiendaDAO.getInstancia().getManifiesto(encomienda.getIdManifiesto());
		e.setManifiesto(m);
		e.setVolumenGranel(encomienda.getVolumenGranel());
		e.setUnidadGranel(encomienda.getUnidadGranel());
		e.setCargaGranel(encomienda.getCargaGranel());
		
		EncomiendaDAO.getInstancia().altaEncomiendaEmpresa(e);
	}

	public void modificarEncomiendaEmpresa(DTO_EncomiendaEmpresa encomienda) {
		Entity_EncomiendaEmpresa e = new Entity_EncomiendaEmpresa();

		e.setId(encomienda.getId());
		Entity_Sucursal origen = AdministracionDAO.getInstancia().getSucursal(encomienda.getIdSucursalOrigen());
		e.setSucursalOrigen(origen);
		
		Entity_Destino destino = null;
		destino = AdministracionDAO.getInstancia().getDestinoNacional(encomienda.getIdDestino());
		if(destino != null)
			destino = AdministracionDAO.getInstancia().getDestinoInternacional(encomienda.getIdDestino());
		e.setDestino(destino);
		
		Entity_Sucursal sucursalActual = AdministracionDAO.getInstancia().getSucursal(encomienda.getIdSucursalActual());
		e.setSucursalActual(sucursalActual);
		e.setFechaRecepcion(encomienda.getFechaRecepcion());
		e.setFechaMaxima(encomienda.getFechaMaxima());
		e.setEstado(encomienda.getEstado());
		
		Entity_Proveedor prov = ProveedorDAO.getInstancia().getProveedor(encomienda.getIdAseguradora());
		e.setAseguradora(prov);
		e.setLargo(encomienda.getLargo());
		e.setAlto(encomienda.getAlto());
		e.setAncho(encomienda.getAncho());
		e.setPeso(encomienda.getPeso());
		e.setVolumen(encomienda.getVolumen());
		e.setTratamiento(encomienda.getTratamiento());
		e.setApilable(encomienda.isApilable());
		e.setCantApilable(encomienda.getCantApilable());
		e.setRefrigerado(encomienda.isRefrigerado());
		e.setCondicionTransporte(encomienda.getCondicionTransporte());
		e.setIndicacionesManipulacion(encomienda.getIndicacionesManipulacion());
		e.setFragilidad(encomienda.getFragilidad());
		e.setTercerizado(encomienda.isTercerizado());
		e.setKilometrosRecorridos(encomienda.getKilometrosRecorridos());
		e.setFacturado(encomienda.isFacturado());
		e.setValorEstimado(encomienda.getValorEstimado());
		e.setDistanciaEstimadaKM(encomienda.getDistanciaEstimadaKM());
		Entity_Cliente c = ClienteDAO.getInstancia().getCliente(encomienda.getIdCliente());
		e.setCliente(c);
		Entity_DireccionEntrega dir = ClienteDAO.getInstancia().getDireccionEntrega(encomienda.getIdDireccionEntrega());
		e.setDireccionEntrega(dir);
		e.setaRetirar(encomienda.isaRetirar());
		e.setLugarRetiro(encomienda.getLugarRetiro());
		e.setFechaRetiro(encomienda.getFechaRetiro());
		e.setHoraMinima(encomienda.getHoraMinima());
		e.setHoraMaxima(encomienda.getHoraMaxima());
		
		Entity_FacturaCliente f = ClienteDAO.getInstancia().getFacturaCliente(encomienda.getIdFacturaCliente());
		e.setFactura(f);
		
		List<Entity_ProductoClienteEncomienda> productos = new ArrayList<Entity_ProductoClienteEncomienda>();
		for(DTO_ProductoClienteEncomienda p : encomienda.getProductos()){
			Entity_ProductoClienteEncomienda producto = null;
			if (p.getId() != null){
				producto = EncomiendaDAO.getInstancia().getProductoClienteEncomienda(p.getId());
				producto.setCantidad(p.getCantidad());
				Entity_ProductoCliente pc = ClienteDAO.getInstancia().getProductoCliente(p.getIdProductoCliente());
				producto.setProductoCliente(pc);
			} else {
				producto = new Entity_ProductoClienteEncomienda();
				producto.setCantidad(p.getCantidad());
				Entity_ProductoCliente pc = ClienteDAO.getInstancia().getProductoCliente(p.getIdProductoCliente());
				producto.setProductoCliente(pc);
			}
			
			productos.add(producto);
		}
		e.setProductos(productos);
		Entity_Manifiesto m = EncomiendaDAO.getInstancia().getManifiesto(encomienda.getIdManifiesto());
		e.setManifiesto(m);
		e.setVolumenGranel(encomienda.getVolumenGranel());
		e.setUnidadGranel(encomienda.getUnidadGranel());
		e.setCargaGranel(encomienda.getCargaGranel());
		
		EncomiendaDAO.getInstancia().modificarEncomiendaEmpresa(e);
	}


	public DTO_EncomiendaEmpresa getEncomiendaEmpresa(Integer idEncomienda) {
		return (DTO_EncomiendaEmpresa) EncomiendaDAO.getInstancia().getEncomiendaEmpresa(idEncomienda).toDTO();
	}


	public void altaEncomiendaParticular(DTO_EncomiendaParticular encomienda) {
		Entity_EncomiendaParticular e = new Entity_EncomiendaParticular();

		Entity_Sucursal origen = AdministracionDAO.getInstancia().getSucursal(encomienda.getIdSucursalOrigen());
		e.setSucursalOrigen(origen);

		Entity_Destino destino = null;
		destino = AdministracionDAO.getInstancia().getDestinoNacional(encomienda.getIdDestino());
		if(destino != null)
			destino = AdministracionDAO.getInstancia().getDestinoInternacional(encomienda.getIdDestino());
		e.setDestino(destino);
		
		Entity_Sucursal sucursalActual = AdministracionDAO.getInstancia().getSucursal(encomienda.getIdSucursalActual());
		e.setSucursalActual(sucursalActual);
		e.setFechaRecepcion(encomienda.getFechaRecepcion());
		e.setFechaMaxima(encomienda.getFechaMaxima());
		e.setEstado(encomienda.getEstado());
		Entity_Proveedor prov = ProveedorDAO.getInstancia().getProveedor(encomienda.getIdAseguradora());
		e.setAseguradora(prov);
		e.setLargo(encomienda.getLargo());
		e.setAlto(encomienda.getAlto());
		e.setAncho(encomienda.getAncho());
		e.setPeso(encomienda.getPeso());
		e.setVolumen(encomienda.getVolumen());
		e.setTratamiento(encomienda.getTratamiento());
		e.setApilable(encomienda.isApilable());
		e.setCantApilable(encomienda.getCantApilable());
		e.setRefrigerado(encomienda.isRefrigerado());
		e.setCondicionTransporte(encomienda.getCondicionTransporte());
		e.setIndicacionesManipulacion(encomienda.getIndicacionesManipulacion());
		e.setFragilidad(encomienda.getFragilidad());
		e.setTercerizado(encomienda.isTercerizado());
		e.setKilometrosRecorridos(encomienda.getKilometrosRecorridos());
		e.setFacturado(encomienda.isFacturado());
		e.setValorEstimado(encomienda.getValorEstimado());
		e.setDistanciaEstimadaKM(encomienda.getDistanciaEstimadaKM());
		Entity_FacturaCliente f = ClienteDAO.getInstancia().getFacturaCliente(encomienda.getIdFacturaCliente());
		e.setFactura(f);
		
		e.setNombreParticular(encomienda.getNombreParticular());
		e.setApellidoParticular(encomienda.getApellidoParticular());
		e.setDniParticular(encomienda.getDniParticular());
		e.setDireccionDestino(encomienda.getDireccionDestino());
		e.setCodigoPostalDestino(encomienda.getCodigoPostalDestino());
		e.setLocalidadDestino(encomienda.getLocalidadDestino());
		e.setProvinciaDestino(encomienda.getProvinciaDestino());
		e.setPaisDestino(encomienda.getPaisDestino());
		Entity_Manifiesto m = EncomiendaDAO.getInstancia().getManifiesto(encomienda.getIdManifiesto());
		e.setManifiesto(m);
		
		EncomiendaDAO.getInstancia().altaEncomiendaParticular(e);
	}


	public void modificarEncomiendaParticular(DTO_EncomiendaParticular encomienda)  {
		Entity_EncomiendaParticular e = new Entity_EncomiendaParticular();

		e.setId(encomienda.getId());

		Entity_Sucursal origen = AdministracionDAO.getInstancia().getSucursal(encomienda.getIdSucursalOrigen());
		e.setSucursalOrigen(origen);

		Entity_Destino destino = null;
		destino = AdministracionDAO.getInstancia().getDestinoNacional(encomienda.getIdDestino());
		if(destino != null)
			destino = AdministracionDAO.getInstancia().getDestinoInternacional(encomienda.getIdDestino());
		e.setDestino(destino);
		
		Entity_Sucursal sucursalActual = AdministracionDAO.getInstancia().getSucursal(encomienda.getIdSucursalActual());
		e.setSucursalActual(sucursalActual);
		e.setFechaRecepcion(encomienda.getFechaRecepcion());
		e.setFechaMaxima(encomienda.getFechaMaxima());
		e.setEstado(encomienda.getEstado());
		Entity_Proveedor prov = ProveedorDAO.getInstancia().getProveedor(encomienda.getIdAseguradora());
		e.setAseguradora(prov);
		e.setLargo(encomienda.getLargo());
		e.setAlto(encomienda.getAlto());
		e.setAncho(encomienda.getAncho());
		e.setPeso(encomienda.getPeso());
		e.setVolumen(encomienda.getVolumen());
		e.setTratamiento(encomienda.getTratamiento());
		e.setApilable(encomienda.isApilable());
		e.setCantApilable(encomienda.getCantApilable());
		e.setRefrigerado(encomienda.isRefrigerado());
		e.setCondicionTransporte(encomienda.getCondicionTransporte());
		e.setIndicacionesManipulacion(encomienda.getIndicacionesManipulacion());
		e.setFragilidad(encomienda.getFragilidad());
		e.setTercerizado(encomienda.isTercerizado());
		e.setKilometrosRecorridos(encomienda.getKilometrosRecorridos());
		e.setFacturado(encomienda.isFacturado());
		e.setValorEstimado(encomienda.getValorEstimado());
		e.setDistanciaEstimadaKM(encomienda.getDistanciaEstimadaKM());
		Entity_FacturaCliente f = ClienteDAO.getInstancia().getFacturaCliente(encomienda.getIdFacturaCliente());
		e.setFactura(f);
		
		e.setNombreParticular(encomienda.getNombreParticular());
		e.setApellidoParticular(encomienda.getApellidoParticular());
		e.setDniParticular(encomienda.getDniParticular());
		e.setDireccionDestino(encomienda.getDireccionDestino());
		e.setCodigoPostalDestino(encomienda.getCodigoPostalDestino());
		e.setLocalidadDestino(encomienda.getLocalidadDestino());
		e.setProvinciaDestino(encomienda.getProvinciaDestino());
		e.setPaisDestino(encomienda.getPaisDestino());
		Entity_Manifiesto m = EncomiendaDAO.getInstancia().getManifiesto(encomienda.getIdManifiesto());
		e.setManifiesto(m);
		
		EncomiendaDAO.getInstancia().modificarEncomiendaParticular(e);
	}


	public DTO_EncomiendaParticular getEncomiendaParticular(Integer idEncomienda)	 {
		return (DTO_EncomiendaParticular) EncomiendaDAO.getInstancia().getEncomiendaParticular(idEncomienda).toDTO();
	}


	public void ingresoStock(Integer idStock, Integer idEncomienda) {
	/*	Entity_Stock stock = AdministracionDAO.getInstancia().getStock(idStock);
		
		Entity_Encomienda e = null;
		e = EncomiendaDAO.getInstancia().getEncomiendaEmpresa(idEncomienda);
		if(e == null)
			e = EncomiendaDAO.getInstancia().getEncomiendaParticular(idEncomienda);
	
		Entity_EncomiendaEnStock encomiendaStock = new Entity_EncomiendaEnStock();
		
		encomiendaStock.setEncomienda(e);*/
	
	}


	public void movimientoInterno(Integer idStock, Integer idEncomienda) {
	
		
	}


	public void egresoStock(Integer idStock, Integer idEncomienda) {

		
	}


	public void altaEnvio(DTO_EnvioPropio envio) {
		Entity_EnvioPropio e = new Entity_EnvioPropio();
		e.setEstado(envio.getEstado());
		e.setPosicionActual(envio.getPosicionActual());		
		
		List<Entity_Encomienda> lista = new ArrayList<Entity_Encomienda>();
		
		
		for(DTO_Encomienda en:envio.getEncomiendas()){
			Entity_Encomienda encomienda = null;
			encomienda = EncomiendaDAO.getInstancia().getEncomiendaParticular(en.getId());
			if(encomienda == null)
				encomienda = EncomiendaDAO.getInstancia().getEncomiendaEmpresa(en.getId());
			lista.add(encomienda);
		}
			
		e.setEncomiendas(lista);

		Entity_Vehiculo v = VehiculoDAO.getInstancia().getVehiculo(envio.getIdVehiculo());
		e.setVehiculo(v);
		
		Entity_HojaDeRuta h = EncomiendaDAO.getInstancia().getHojaDeRuta(envio.getIdHojaDeRuta());
		e.setHojaRuta(h);

		e.setFechaSalida(envio.getFechaSalida());
		e.setHoraSalida(envio.getHoraSalida());
		e.setFechaLlegada(envio.getFechaLlegada());
		e.setHoraLlegada(envio.getHoraLlegada());

		EncomiendaDAO.getInstancia().altaEnvioPropio(e);
	}


	public void modificarEnvio(DTO_EnvioPropio envio) {
		Entity_EnvioPropio e = new Entity_EnvioPropio();
		e.setId(envio.getId());
		e.setEstado(envio.getEstado());
		e.setPosicionActual(envio.getPosicionActual());		
		
		List<Entity_Encomienda> lista = new ArrayList<Entity_Encomienda>();
		
		
		for(DTO_Encomienda en:envio.getEncomiendas()){
			Entity_Encomienda encomienda = null;
			encomienda = EncomiendaDAO.getInstancia().getEncomiendaParticular(en.getId());
			if(encomienda == null)
				encomienda = EncomiendaDAO.getInstancia().getEncomiendaEmpresa(en.getId());
			lista.add(encomienda);
		}
			
		e.setEncomiendas(lista);

		Entity_Vehiculo v = VehiculoDAO.getInstancia().getVehiculo(envio.getIdVehiculo());
		e.setVehiculo(v);
		
		Entity_HojaDeRuta h = EncomiendaDAO.getInstancia().getHojaDeRuta(envio.getIdHojaDeRuta());
		e.setHojaRuta(h);

		e.setFechaSalida(envio.getFechaSalida());
		e.setHoraSalida(envio.getHoraSalida());
		e.setFechaLlegada(envio.getFechaLlegada());
		e.setHoraLlegada(envio.getHoraLlegada());

		EncomiendaDAO.getInstancia().modificarEnvioPropio(e);
	}


	public void altaEnvioTercerizado(DTO_EnvioTercerizado envio) {
		Entity_EnvioTercerizado e = new Entity_EnvioTercerizado();
		e.setId(envio.getId());
		e.setEstado(envio.getEstado());
		e.setPosicionActual(envio.getPosicionActual());		
		
		List<Entity_Encomienda> lista = new ArrayList<Entity_Encomienda>();
		
		
		for(DTO_Encomienda en:envio.getEncomiendas()){
			Entity_Encomienda encomienda = null;
			encomienda = EncomiendaDAO.getInstancia().getEncomiendaParticular(en.getId());
			if(encomienda == null)
				encomienda = EncomiendaDAO.getInstancia().getEncomiendaEmpresa(en.getId());
			lista.add(encomienda);
		}
			
		e.setEncomiendas(lista);
		
		Entity_Proveedor p = ProveedorDAO.getInstancia().getProveedor(envio.getIdProveedor());
		e.setProveedor(p);
		e.setNumeroTracking(envio.getNumeroTracking());
		
		EncomiendaDAO.getInstancia().altaEnvioTercerizado(e);
	}


	public void modificarEnvioTercerizado(DTO_EnvioTercerizado envio) {
		Entity_EnvioTercerizado e = new Entity_EnvioTercerizado();
		e.setId(envio.getId());
		e.setEstado(envio.getEstado());
		e.setPosicionActual(envio.getPosicionActual());		
		
		List<Entity_Encomienda> lista = new ArrayList<Entity_Encomienda>();
		
		
		for(DTO_Encomienda en:envio.getEncomiendas()){
			Entity_Encomienda encomienda = null;
			encomienda = EncomiendaDAO.getInstancia().getEncomiendaParticular(en.getId());
			if(encomienda == null)
				encomienda = EncomiendaDAO.getInstancia().getEncomiendaEmpresa(en.getId());
			lista.add(encomienda);
		}
			
		e.setEncomiendas(lista);
		
		Entity_Proveedor p = ProveedorDAO.getInstancia().getProveedor(envio.getIdProveedor());
		e.setProveedor(p);
		e.setNumeroTracking(envio.getNumeroTracking());
		
		EncomiendaDAO.getInstancia().modificarEnvioTercerizado(e);
	}


	public DTO_Envio getEnvio(Integer idEnvio)  {
		DTO_Envio e = null;
		e = EncomiendaDAO.getInstancia().getEnvioPropio(idEnvio).toDTO();
		if(e != null)
			e = EncomiendaDAO.getInstancia().getEnvioTercerizado(idEnvio).toDTO();
		return e;
	}


	public void altaHojaRuta(DTO_HojaDeRuta hojaRuta)  {
		Entity_HojaDeRuta hr = new Entity_HojaDeRuta();
		hr.setId(hojaRuta.getId());
		List<Entity_Trayecto> lista = new ArrayList<Entity_Trayecto>();
		for(DTO_Trayecto trayecto : hojaRuta.getTrayectos()){
			Entity_Trayecto t = null;
			
			if(trayecto instanceof DTO_TrayectoIntersucursal){
				t = new Entity_TrayectoIntersucursal();
				
				t.setId(trayecto.getId());
				t.setDistanciaKM(trayecto.getDistanciaKM());
				t.setTiempoDias(trayecto.getTiempoDias());
				t.setDescripcion(trayecto.getDescripcion());
				
				Entity_Sucursal so = AdministracionDAO.getInstancia().getSucursal(((DTO_TrayectoIntersucursal) trayecto).getIdSucursalOrigen());
				
				((Entity_TrayectoIntersucursal) t).setOrigen(so);
				
				Entity_Sucursal sd = AdministracionDAO.getInstancia().getSucursal(((DTO_TrayectoIntersucursal) trayecto).getIdSucursalDestino());
				
				((Entity_TrayectoIntersucursal) t).setDestino(sd);

			}
			if(trayecto instanceof DTO_TrayectoOrigenSucursal){
				t = new Entity_TrayectoOrigenSucursal();
				
				t.setId(trayecto.getId());
				t.setDistanciaKM(trayecto.getDistanciaKM());
				t.setTiempoDias(trayecto.getTiempoDias());
				t.setDescripcion(trayecto.getDescripcion());
				
				((Entity_TrayectoOrigenSucursal) t).setDireccionOrigen(((DTO_TrayectoOrigenSucursal) trayecto).getDireccionOrigen());
				((Entity_TrayectoOrigenSucursal) t).setCodigoPostalOrigen(((DTO_TrayectoOrigenSucursal) trayecto).getCodigoPostalOrigen());
				((Entity_TrayectoOrigenSucursal) t).setLocalidadOrigen(((DTO_TrayectoOrigenSucursal) trayecto).getLocalidadOrigen());
				((Entity_TrayectoOrigenSucursal) t).setProvinciaOrigen(((DTO_TrayectoOrigenSucursal) trayecto).getProvinciaOrigen());
				Entity_Sucursal sd = AdministracionDAO.getInstancia().getSucursal(((DTO_TrayectoIntersucursal) trayecto).getIdSucursalDestino());
				
				((Entity_TrayectoOrigenSucursal) t).setDestino(sd);
				
			}
			if(trayecto instanceof DTO_TrayectoSucursalDestino){
				t = new Entity_TrayectoSucursalDestino();
				
				t.setId(trayecto.getId());
				t.setDistanciaKM(trayecto.getDistanciaKM());
				t.setTiempoDias(trayecto.getTiempoDias());
				t.setDescripcion(trayecto.getDescripcion());
				
				
				Entity_Sucursal so = AdministracionDAO.getInstancia().getSucursal(((DTO_TrayectoIntersucursal) trayecto).getIdSucursalOrigen());
				
				((Entity_TrayectoIntersucursal) t).setOrigen(so);
				((Entity_TrayectoSucursalDestino) t).setDireccionDestino(((DTO_TrayectoSucursalDestino) trayecto).getDireccionDestino());
				((Entity_TrayectoSucursalDestino) t).setCodigoPostalDestino(((DTO_TrayectoSucursalDestino) trayecto).getCodigoPostalDestino());
				((Entity_TrayectoSucursalDestino) t).setLocalidadDestino(((DTO_TrayectoSucursalDestino) trayecto).getLocalidadDestino());
				((Entity_TrayectoSucursalDestino) t).setProvinciaDestino(((DTO_TrayectoSucursalDestino) trayecto).getProvinciaDestino());

			}
			
			lista.add(t);

		}
			
		hr.setTrayectos(lista);
		EncomiendaDAO.getInstancia().altaHojaDeRuta(hr);
		
	}


	public void modificarHojaRuta(DTO_HojaDeRuta hojaRuta)  {
		Entity_HojaDeRuta hr = new Entity_HojaDeRuta();
		hr.setId(hojaRuta.getId());
		List<Entity_Trayecto> lista = new ArrayList<Entity_Trayecto>();
		for(DTO_Trayecto trayecto : hojaRuta.getTrayectos()){
			Entity_Trayecto t = null;
			
			if(trayecto instanceof DTO_TrayectoIntersucursal){
				t = new Entity_TrayectoIntersucursal();
				
				t.setId(trayecto.getId());
				t.setDistanciaKM(trayecto.getDistanciaKM());
				t.setTiempoDias(trayecto.getTiempoDias());
				t.setDescripcion(trayecto.getDescripcion());
				
				Entity_Sucursal so = AdministracionDAO.getInstancia().getSucursal(((DTO_TrayectoIntersucursal) trayecto).getIdSucursalOrigen());
				
				((Entity_TrayectoIntersucursal) t).setOrigen(so);
				
				Entity_Sucursal sd = AdministracionDAO.getInstancia().getSucursal(((DTO_TrayectoIntersucursal) trayecto).getIdSucursalDestino());
				
				((Entity_TrayectoIntersucursal) t).setDestino(sd);

			}
			if(trayecto instanceof DTO_TrayectoOrigenSucursal){
				t = new Entity_TrayectoOrigenSucursal();
				
				t.setId(trayecto.getId());
				t.setDistanciaKM(trayecto.getDistanciaKM());
				t.setTiempoDias(trayecto.getTiempoDias());
				t.setDescripcion(trayecto.getDescripcion());
				
				((Entity_TrayectoOrigenSucursal) t).setDireccionOrigen(((DTO_TrayectoOrigenSucursal) trayecto).getDireccionOrigen());
				((Entity_TrayectoOrigenSucursal) t).setCodigoPostalOrigen(((DTO_TrayectoOrigenSucursal) trayecto).getCodigoPostalOrigen());
				((Entity_TrayectoOrigenSucursal) t).setLocalidadOrigen(((DTO_TrayectoOrigenSucursal) trayecto).getLocalidadOrigen());
				((Entity_TrayectoOrigenSucursal) t).setProvinciaOrigen(((DTO_TrayectoOrigenSucursal) trayecto).getProvinciaOrigen());
				Entity_Sucursal sd = AdministracionDAO.getInstancia().getSucursal(((DTO_TrayectoIntersucursal) trayecto).getIdSucursalDestino());
				
				((Entity_TrayectoOrigenSucursal) t).setDestino(sd);
				
			}
			if(trayecto instanceof DTO_TrayectoSucursalDestino){
				t = new Entity_TrayectoSucursalDestino();
				
				t.setId(trayecto.getId());
				t.setDistanciaKM(trayecto.getDistanciaKM());
				t.setTiempoDias(trayecto.getTiempoDias());
				t.setDescripcion(trayecto.getDescripcion());
				
				
				Entity_Sucursal so = AdministracionDAO.getInstancia().getSucursal(((DTO_TrayectoIntersucursal) trayecto).getIdSucursalOrigen());
				
				((Entity_TrayectoIntersucursal) t).setOrigen(so);
				((Entity_TrayectoSucursalDestino) t).setDireccionDestino(((DTO_TrayectoSucursalDestino) trayecto).getDireccionDestino());
				((Entity_TrayectoSucursalDestino) t).setCodigoPostalDestino(((DTO_TrayectoSucursalDestino) trayecto).getCodigoPostalDestino());
				((Entity_TrayectoSucursalDestino) t).setLocalidadDestino(((DTO_TrayectoSucursalDestino) trayecto).getLocalidadDestino());
				((Entity_TrayectoSucursalDestino) t).setProvinciaDestino(((DTO_TrayectoSucursalDestino) trayecto).getProvinciaDestino());

			}
			
			lista.add(t);

		}
			
		hr.setTrayectos(lista);
		EncomiendaDAO.getInstancia().modificarHojaDeRuta(hr);
		
	}


	public DTO_HojaDeRuta getHojaRuta(Integer idHojaRuta) {
		return EncomiendaDAO.getInstancia().getHojaDeRuta(idHojaRuta).toDTO();
	}


	public void altaRemito(DTO_Remito remito)  {
		Entity_Remito r = new Entity_Remito();
		r.setId(remito.getId());
		r.setNumero(remito.getNumero());
		r.setFecha(remito.getFecha());
		r.setHora(remito.getHora());
		r.setConformado(remito.isConformado());
		r.setRecibidoPor(remito.getRecibidoPor());
		
		Entity_Encomienda e = null;
		e = EncomiendaDAO.getInstancia().getEncomiendaEmpresa(remito.getIdEncomienda());
		if (e == null)
			e = EncomiendaDAO.getInstancia().getEncomiendaParticular(remito.getIdEncomienda());
		
		r.setEncomienda(e);
		
		EncomiendaDAO.getInstancia().altaRemito(r);
	}


	public void conformarRemito(Integer idRemito, String recibidoPor) {
		Entity_Remito r = EncomiendaDAO.getInstancia().getRemito(idRemito);
		r.setRecibidoPor(recibidoPor);
		EncomiendaDAO.getInstancia().modificarRemito(r);
	}


	public List<DTO_ActividadEncomienda> listarActividades(Integer idEncomienda) {
		List<Entity_ActividadEncomienda> lista =	EncomiendaDAO.getInstancia().listarActividades(idEncomienda);
		if(lista != null){
			List<DTO_ActividadEncomienda>  listaDTO = new ArrayList<DTO_ActividadEncomienda>();
			for(Entity_ActividadEncomienda a : lista)
				listaDTO.add(a.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_Destinatario> listarDestinatarios(Integer idEncomienda) {
		List<Entity_Destinatario> lista =	EncomiendaDAO.getInstancia().listarDestinatarios(idEncomienda);
		if(lista != null){
			List<DTO_Destinatario>  listaDTO = new ArrayList<DTO_Destinatario>();
			for(Entity_Destinatario d : lista)
				listaDTO.add(d.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_Encomienda> listarEncomiendas()  {
		List<DTO_EncomiendaEmpresa> le = this.listarEncomiendasEmpresa();
		
		List<DTO_EncomiendaParticular> lp = this.listarEncomiendasParticulares();
		
		List<DTO_Encomienda> lista = new  ArrayList<DTO_Encomienda>();
		
		lista.addAll(le);
		lista.addAll(lp);
		return lista;
	}


	public List<DTO_EncomiendaEmpresa> listarEncomiendasEmpresa() {
		List<Entity_EncomiendaEmpresa> lista =	EncomiendaDAO.getInstancia().listarEncomiendasEmpresa();
		if(lista != null){
			List<DTO_EncomiendaEmpresa>  listaDTO = new ArrayList<DTO_EncomiendaEmpresa>();
			for(Entity_EncomiendaEmpresa d : lista)
				listaDTO.add((DTO_EncomiendaEmpresa) d.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_EncomiendaParticular> listarEncomiendasParticulares() {
		List<Entity_EncomiendaParticular> lista =	EncomiendaDAO.getInstancia().listarEncomiendasParticulares();
		if(lista != null){
			List<DTO_EncomiendaParticular>  listaDTO = new ArrayList<DTO_EncomiendaParticular>();
			for(Entity_EncomiendaParticular d : lista)
				listaDTO.add((DTO_EncomiendaParticular) d.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_Encomienda> listarEncomiendas(Integer idSucursal) {
		List<DTO_EncomiendaEmpresa> le = this.listarEncomiendasEmpresa(idSucursal);
		
		List<DTO_EncomiendaParticular> lp = this.listarEncomiendasParticulares(idSucursal);
		
		List<DTO_Encomienda> lista = new  ArrayList<DTO_Encomienda>();
		
		lista.addAll(le);
		lista.addAll(lp);
		return lista;
	}


	public List<DTO_EncomiendaEmpresa> listarEncomiendasEmpresa(Integer idSucursal)  {
		List<Entity_EncomiendaEmpresa> lista =	EncomiendaDAO.getInstancia().listarEncomiendasEmpresa(idSucursal);
		if(lista != null){
			List<DTO_EncomiendaEmpresa>  listaDTO = new ArrayList<DTO_EncomiendaEmpresa>();
			for(Entity_EncomiendaEmpresa d : lista)
				listaDTO.add((DTO_EncomiendaEmpresa) d.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_EncomiendaParticular> listarEncomiendasParticulares(Integer idSucursal)  {
		List<Entity_EncomiendaParticular> lista =	EncomiendaDAO.getInstancia().listarEncomiendasParticulares(idSucursal);
		if(lista != null){
			List<DTO_EncomiendaParticular>  listaDTO = new ArrayList<DTO_EncomiendaParticular>();
			for(Entity_EncomiendaParticular d : lista)
				listaDTO.add((DTO_EncomiendaParticular) d.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_EnvioPropio> listarEnviosPropios()  {
		List<Entity_EnvioPropio> lista =	EncomiendaDAO.getInstancia().listarEnviosPropios();
		if(lista != null){
			List<DTO_EnvioPropio>  listaDTO = new ArrayList<DTO_EnvioPropio>();
			for(Entity_EnvioPropio d : lista)
				listaDTO.add((DTO_EnvioPropio) d.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_EnvioTercerizado> listarEnviosTercerizados() {
		List<Entity_EnvioTercerizado> lista =	EncomiendaDAO.getInstancia().listarEnviosTercerizados();
		if(lista != null){
			List<DTO_EnvioTercerizado>  listaDTO = new ArrayList<DTO_EnvioTercerizado>();
			for(Entity_EnvioTercerizado d : lista)
				listaDTO.add((DTO_EnvioTercerizado) d.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_ProductoClienteEncomienda> listarProductosEncomienda(Integer idEncomienda)  {
		List<Entity_ProductoClienteEncomienda> lista =	EncomiendaDAO.getInstancia().listarProductosEncomienda(idEncomienda);
		if(lista != null){
			List<DTO_ProductoClienteEncomienda>  listaDTO = new ArrayList<DTO_ProductoClienteEncomienda>();
			for(Entity_ProductoClienteEncomienda d : lista)
				listaDTO.add((DTO_ProductoClienteEncomienda) d.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_Remito> listarRemitos(Integer idEncomienda) {
		List<Entity_Remito> lista =	EncomiendaDAO.getInstancia().listarRemitos(idEncomienda);
		if(lista != null){
			List<DTO_Remito>  listaDTO = new ArrayList<DTO_Remito>();
			for(Entity_Remito r : lista)
				listaDTO.add(r.toDTO());
			return listaDTO;
		}
		return null;
	}


	public List<DTO_Trayecto> listarTrayectos(Integer idHojaRuta){
		List<Entity_Trayecto> lista =	EncomiendaDAO.getInstancia().listarTrayectos(idHojaRuta);
		if(lista != null){
			List<DTO_Trayecto>  listaDTO = new ArrayList<DTO_Trayecto>();
			for(Entity_Trayecto t : lista)
				listaDTO.add(t.toDTO());
			return listaDTO;
		}
		return null;
	}
	
}
